Problem
【SDOI2014】LIS
Description
给定序列,序列中的每一项有删除代价和附加属性。
请删除若干项,使得的最长上升子序列长度减少至少,且付出的代价之和最小,并输出方案。
如果有多种方案,请输出将删去项的附加属性排序之后,字典序最小的一种。
Input
输入包含多组数据。
输入的第一行包含整数,表示数据组数。
接下来行描述每组数据。
每组数据的第一行包含一个整数,表示的项数。
接下来三行,每行个整数,,。
Output
对每组数据,输出两行。
第一行包含两个整数,依次表示删去项的代价和与数量;
接下来一行个整数,表示删去项在中的的位置,按升序输出。
Sample Input
1 | 1 |
Sample Output
1 | 4 3 |
Explanation
删去,,等都是合法的方案,但对应的值的字典序最小。
HINT
,两两不同
标签:网络流
退流
Solution
最小割+网络流退流
首先做一遍求出数组,即每个前缀中的长度,令最长的长度为。
若不考虑字典序最小的限制,只要求最小代价,则是一个最小割模型。将每个位置拆成和两个点,分别代表入点和出点。连接流量,割这条边代表删除。对于所有,连接流量,这样每个长度为的序列都连成一条链,两位置间不能隔开,只能删除其中的某个数,即每个位置入点到出点的边。这样跑最大流得到最小割即为最小代价。
考虑字典序最小的限制。先用上面的建图跑出一个可行解,然后按从小往大看能否用小的数换当前可行解中大的数,显然每次还完之后要调整当前可行解。对于当前枚举到的位置,若其不在当前可行解中,则以为源点,原源点为汇点,跑一遍网络流,再以为源点,为汇点跑一遍网络流。这样可以用反向边使前面的可行流“返回”,达到调整可行解的效果。然后将这条边删除,以后的可行解中将不再会删掉这个点。这样贪心调整即可得到最终答案。
Code
1 |
|